Tutoriel Gtk2Hs

Tutoriel Gtk2Hs 5.3 - Sélection de fontes et de couleurs

La sélection de fontes et de couleurs se fait à peu près comme la sélection de fichiers. Il y a trois manières de les implémenter, en tant que widget, en tant que dialogue ou en tant que boutons. Les valeurs sélectionnées par l'utilisateur sont récupérées par le biais d'attributs ou de fonctions appropriées. Nous allons d'abord aborder la sélection de fontes, on utilise:

fontSelectionNew :: IO FontSelection
fontSelectionDialogNew :: String -> IO FontSelectionDialog
fontButtonNew :: IO FontButton

Le paramètre String est le titre de la fenêtre de dialogue. Il y a une série d'attributs et des fonctions pour gérer l'affichage de ces widgets. Toutes assez simples. Avec un dialogue, vous pouvez utiliser les types ResponseId; et avec vous utiliserez:

onFontSet:: FontButtonClass self => self -> IO () -> IO (ConnectId self)

Vous utiliserez alors la fonction suivante pour obtenir le nom de la fonte sélectionnée:

fontButtonGetFontName :: FontButtonClass self => self -> IO String

Le nom de la fonte sera quelque chose comme "Courier Italic 10" ou "URW Gothic L Semi-Bold Oblique 16", tout ce qui est disponible sur votre système. Comme vous pouvez le voir sur l'image suivante, l'utilisateur peut sélectionner une famille, un style, une taille.

Gtk
 
Gtk2Hs
 
Font
 
Select
 
Window

Chercher et obtenir des informations sur les fontes est documenté dans Graphics.UI.Gtk.Pango.Font. Beaucoup de fonctionnalités avancées sont supportées, mais l'utilisateur de base aura seulement besoin de savoir comment obtenir une description (FontDescription) à partir du nom d'une fonte.

fontDescriptionFromString :: String -> IO FontDescription

Une fois que l'on a la description (FontDescription) on peut utiliser:

widgetModifyFont:: WidgetClass self => self -> Maybe FontDescription -> IO ()

La sélection d'une couleur est analogue à la sélection d'une fonte. Vous avez trois possibilités:

colorSelectionNew :: IO Color Selection
colorSelectionDialogNew: :: String -> IO ColorSelectionDialog
colorButtonNew :: IO Color Button

Avec un bouton ColorButton, utilisez

onColorSet :: ColorButtonClass self => self -> IO () -> IO (ConnectId self)

puis:

colorButtonGetColor :: ColorButtonClass self => self -> IO Color

Il y a aussi une fonction (et un attribut) pour obtenir la valeur Alpha (l'opacité) si cette fonctionnalité a été activée.

La fenêtre par défaut de sélection de couleur, ressemble à cela:

Gtk
 
Gtk2Hs
 
Color
 
Selection
 
Window

Une couleur est un type de données composées de trois entiers Int, pouvant aller de 0 à 65535, qui spécifient respectivement les composantes Rouge, Vert et Bleu. Il y a des fonctions pour définir les couleurs d'avant-plan, d'arrière-plan, les textes et les couleurs d'un widget et ces fonctions prennent un paramètre StateType Il y a: StateNormal, StateActive, StatePreLight, StateSelected et StateInsensitive et varient suivant que le widget est actif, le pointeur de la souris est sur le widget, si le widget est sélectionné, …. L'affichage des widgets a plusieurs fonctionnalités, mais pour changer la couleur d'une étiquette, vous pouvez simplement utiliser StateNormal et la couleur Color que l'utilisateur a choisi:

widgetModifyFg :: WidgetClass self => self -> StateType -> Color -> IO ()

Si on ne connaît pas l'état StateType du widget, on peut utiliser cette fonction:

widgetGetState :: WidgetClass w => w -> IO StateType

Voici un exemple de sélection de fonte et de couleur.

Gtk
 
Gtk2Hs
 
FontButton
 
and
 
Color
 
Button
 
Example

La fenêtre se redimensionne automatiquement pour s'adapter à la fonte la plus large.

Gtk
 
Gtk2Hs
 
Window

import Graphics.UI.Gtk

main :: IO ()
main = do
     initGUI
     window <- windowNew
     set window [windowTitle := "Font and Color Selection",
                 containerBorderWidth := 10 ]
     vb <- vBoxNew False 0
     containerAdd window vb

     qtlab <- labelNew (Just "How poor are they that have not
patience!\nWhat wound did ever heal but by degrees?\nThou know'st
we work by wit, and not by witchcraft;\nAnd wit depends on dilatory
time.")
     boxPackStart vb qtlab PackGrow 0

     srclab <- labelNew (Just "From Othello (II, iii, 376-379)")
     srcfont <- fontDescriptionFromString "Courier Italic 10"
     widgetModifyFont srclab (Just srcfont)
     miscSetAlignment srclab 1.0 0.5
     boxPackStart vb srclab PackNatural 10

     sep <- hSeparatorNew
     boxPackStart vb sep PackGrow 10
     
     fntb <- fontButtonNew
     boxPackStart vb fntb PackGrow 0

     colb <- colorButtonNew
     boxPackStart vb colb PackGrow 0

     onFontSet fntb $ do name <- fontButtonGetFontName fntb
                         fdesc <- fontDescriptionFromString name
                         widgetModifyFont qtlab (Just fdesc)
                         putStrLn name

     onColorSet colb $ do colour <- colorButtonGetColor colb
                          widgetModifyFg qtlab StateNormal colour
                          putStrLn (show  colour)

     widgetShowAll window
     onDestroy window mainQuit
     mainGUI

instance Show Color where
         show (Color r g b) = "Red: " ++ (show r) ++ 
                              " Green: " ++ (show g) ++ 
                              " Blue: " ++ (show b)